package creation_patterns.singleton_pattern.eunm;

/*
 * @Author xuhj (https://juejin.cn/post/6844904094633558030)
 * @Description 枚举单例模式能够在序列化和反射中保证实例的唯一性，在枚举中我们明确了构造方法限制为私有，在我们访问枚举实例时会执行构造方法，同时每个枚举实例都是static final类型的，也就表明只能被实例化一次。在调用构造方法时，我们的单例被实例化。
 * 也就是说，因为enum中的实例被保证只会被实例化一次，所以我们的INSTANCE也被保证实例化一次。
 * @Date 10:36 下午 2022/1/1
 * @Param
 * @return
 **/
public class EnumSingleton {
    private EnumSingleton(){
    }

    
    public enum InnerEnum{
        INSTANCE;
        private EnumSingleton enumSingleton;

        InnerEnum() {
            enumSingleton = new EnumSingleton();
        }
        public  EnumSingleton getInstanceFromEnum(){
            return enumSingleton; 
        }
    }
    
    public static EnumSingleton getInstance(){
        return InnerEnum.INSTANCE.getInstanceFromEnum();
    }
    
}
class Test{
    public static void main(String[] args) {
        EnumSingleton instance = EnumSingleton.getInstance();
    }
}